package com.changjiang.luban.utils.dao;

import com.changjiang.luban.utils.data.Page;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * Description:自定义BaseRepository接口
 *
 * @author changjiang
 * Date: 2018-03-28
 * Time: 10:35
 */
@NoRepositoryBean
public interface BaseDao<T,ID extends Serializable> extends JpaRepository<T,ID> {

    /**
     * 新增对象
     * @param entity 对象实体
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    boolean saveEntity(T entity);

    /**
     * 更新对象
     * @param e 对象实体
     * @return true 更新成功  false 更新失败
     */
    @Transactional(rollbackFor = Exception.class)
    boolean update(T e);

    /**
     * 删除实体对象
     * @param e 对象实体
     * @return true 删除成功  false 删除失败
     */
    @Transactional(rollbackFor = Exception.class)
    boolean deleteEntity(T e);

    /**
     * 单个sum函数查询
     * @param sql 查询语句
     * @return 总和值
     */
    Integer sum(String sql);

    /**
     * 单个对象数据查询
     * @param sql 查询sql
     * @param clazz 结果转换的实体类型，实体类型为空直接转换为Map格式返回
     * @return clazz为null 返回Map 其他返回 clazz对象
     */
    Object get(String sql, Class<?> clazz);

    /**
     * 集合数据查询
     * @param sql 查询sql
     * @param clazz 结果转换的实体类型，实体类型为空直接转换为Map格式返回
     * @return 集合
     */
    List list(String sql, Class<?> clazz);

    /**
     *
     * @param page
     * @param nameQuery
     * @return
     */
    Page page(Page page, String nameQuery);

    /**
     * 分页查询接口
     * @param sql 查询SQL
     * @param page 分页对象
     * @param clazz 结果转换的实体类型，实体类型为空直接转换为Map格式返回
     * @return Page 分页对象
     */
    Page page(String sql, Page page, Class<?> clazz);

    /**
     * 分页查询接口
     * @param sql 查询SQL
     * @param params 查询参数
     * @param page 分页对象
     * @param clazz 结果转换的实体类型，实体类型为空直接转换为Map格式返回
     * @return Page 分页对象
     */
    Page page(String sql, Map<String, Object> params, Page page, Class<?> clazz);

    /**
     * 查询结果记录数
     * @param sql 查询SQL
     * @return 记录数
     */
    Integer getResultCount(String sql);
}
